#include<bits/stdc++.h> 
using namespace std;
//	在火星购物有特殊的规则，火星人付钱是用钻石链子付的，每个钻石都有一个价值。当火星人付
//	钱的时候，链子就会从某个地方只用一次切开，然后其中几个就拿出来付钱。一旦出去了，就不
//	再回来。例如如果我们有一串8个钻石组成的链子，价格分别为3,2,1,5,4,6,8,7，当我们要买15
//	元东西的时候，我们有3个选择。 ①砍4和6之间，使得前面的32154为15；②砍5前面或者6后面，
//	让546能出来得到15；③砍8前面，87得15。现在给定一串钻石链子的价值，以及需要购买商品的
//	价格，需要列举所有可以支付的选项。如果没法付钱，则输出损失最小的方案
//1.每个输入包括一个测试用例，对于每个测试用例，第一行包括两个数字N≤100000，M≤100000000
//	，分别表示钻石总个数以及需要付的钱。
//2.然后跟着一行N个正整数，编号从1开始，每个都≤1000
//3.对于每个测试用例，每一行输出i-j的格式，其中i≤j且Di+..+Dj=M，所有输出以i递增。如果不
//	存在支付方案，则输出Di+..+Dj>M，且差值最小
//4.题目保证一定付得起
//5.穷举
string getPair(int i,int j){	//通过传入的两个下标，返回一个结果字符串对 
	stringstream ss;
	string tmp = "";
	ss<<i<<'-'<<j;
	tmp = ss.str()+'\n';
	return tmp;
}
int main(){
	int N,M;
	cin>>N>>M;
	int D[N+1];	//钻石价格 
	for(int i=1;i<=N;i++){
		cin>>D[i];
	}
	int minsub = INT_MAX;	//设定最初的最小差值为INT最大值 
	string ans = "";	//用于存放结果 
	int sum_=0;	//用于存放中间的运算结果 
	int i=1, j=0;	//起始下标和结束下标	 
	while(i<=N && j<=N){	//这里如果用双for循环的话就超时两个测试点了 
		if(sum_>=M){	//当总和大于等于M的时候 
			int sub = sum_ - M;	//求得差值 
			if(sub==minsub){	//如果跟当前的最小差一样，就拼接 
				ans += getPair(i,j);
			}
			else if(sub<minsub){	//如果比最小差小，就另起炉灶 
				minsub = sub;
				ans = getPair(i,j);
			}
			sum_ -= D[i];	//不重新再来，而是去掉当前的头，保留其他的不变 
			i++;	//起始位置后移一位 
		}
		else{
			j++;
			sum_ += D[j];	//如果当前的和不够大的话，就后移j 
		} 
	}
	cout<<ans;
	return 0;
}